Django ログイン機能のテンプレ
Login機能のテンプレート
#views #forms
code: settings.py
LOGIN_REDIRECT_URL = '/' # ログイン後のリダイレクト先
LOGOUT_REDIRECT_URL = '/' # ログアウト後のリダイレクト先
LOGIN_URL = 'user:login' # ログインが必要な場合のリダイレクト先
code: urls.py
from django.urls import path
from django.contrib.auth.views import LogoutView
from . import views
app_name = 'user'
urlpatterns = [
path('login/', views.LoginView.as_view(), name='login'),
path('logout/', views.LogoutView.as_view(), name='logout'),
]
code: views.py
from django.contrib.auth.views import LoginView as AuthLoginView
from .forms import AuthenticationForm
class LoginView(AuthLoginView):
form_class = AuthenticationForm
template_name = "user/login.html"
def form_valid(self, form):
"""form.is_valid()がTrueの場合に実行される関数"""
login(self.request, form.get_user(), backend='django.contrib.auth.backends.ModelBackend')
return HttpResponseRedirect(self.get_success_url())
code: forms
from django import forms
class AuthenticationForm(forms.Form):
"""ログイン用のform
ログインformをカスタムしたい場合に作る。デフォルトのformを使いたいなら、django.contrib.auth.forms.AuthenticationFormを利用すると良い
"""
email = forms.EmailField(
widget=forms.EmailInput(attrs={'autofocus': True})
)
password = forms.CharField(
label=_("Password"),
strip=False,
widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
)
error_messages = {
'invalid_login': "emailもしくはpasswordが間違っています",
'inactive': "このアカウントは現在有効ではありません",
}
def __init__(self, request=None, *args, **kwargs):
"""
上3行は基本的なコード。
残りはwidgetにmax_lengthやlabelを設定したり、placeholderを設定したりしてる。
palceholderは結構使うよ。
"""
self.request = request
self.user_cache = None
super().__init__(*args, **kwargs)
# Set the max length and label for the "email" field.
self.email_field = UserModel._meta.get_field(UserModel.USERNAME_FIELD)
email_max_length = self.email_field.max_length or 254
self.fields'email'.max_length = email_max_length
self.fields'email'.widget.attrs'maxlength' = email_max_length
if self.fields'email'.label is None:
self.fields'email'.label = capfirst(self.email_field.verbose_name)
# placeholder
self.fields'email'.widget.attrs'placeholder' = 'email'
self.fields'password'.widget.attrs'placeholder' = 'password'
def clean(self):
"""formsではis_valid()が実行されると、それと一緒に実行されるメソッドが複数ある
cleanメソッドはそのうちの一つ。
ここではcleanの実行で、認証がokかどうかを確かめてる
"""
email = self.cleaned_data.get('email')
password = self.cleaned_data.get('password')
if email is not None and password:
self.user_cache = authenticate(self.request, email=email, password=password)
if self.user_cache is None:
raise self.get_invalid_login_error()
else:
self.confirm_login_allowed(self.user_cache)
return self.cleaned_data
...
code: templates/user/login.html
<form class="login_planeForm" action="{% url 'user:login' %}" method="post">
# このcsrf_tokenは必須。無いとクロスリクエストフォージェリの餌食になる.
{% csrf_token %}
# これはバリデートエラー表示用だよ
{% if form.errors %}
<ul class="valid-errors">
{% for error in form.non_field_errors %}
<li>{{ error }}</li>
{% endfor %}
{% for error in form.email.errors %}
<li>{{ error }}</li>
{% endfor %}
{% for error in form.password.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
# ここで各field用のinputを出せるよ
{{ form.email }}
{{ form.password }}
<button class="button">ログイン</button>
</form>